package com.dfzt.myutils.travel;

import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoUnit;

public class TravelUtil {
    /**
     * 功能：金额转中文大写
     * @return 金额转中文大写
     */
    public static String moneyToChinese(double money){
        // 中文大写数字
        final String[] CN_UPPER_NUMBER = {"零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖"};
        // 中文大写单位
        final String[] CN_UPPER_MONETARY_UNIT = {"分", "角", "元", "拾", "佰", "仟", "万", "亿", "拾亿", "百亿", "千亿", "万亿"};
        // 小数保留位数
        final int MONEY_PRECISION = 2;

        if (money < 0) {
            throw new IllegalArgumentException("金额不能为负数");
        }

        StringBuilder sb = new StringBuilder();

        // 转换为字符串
        String numberStr = String.valueOf(Math.round(money * Math.pow(10, MONEY_PRECISION)));

        // 拼接最终大写金额（从后往前拼）
        for (int i = numberStr.length() - 1; i >= 0; i--) {
            int number = Character.getNumericValue(numberStr.charAt(i)); // 数值
            String cnNumber = CN_UPPER_NUMBER[number];// 对应的中文数值
            int position = numberStr.length() - i - 1; // 位置（从后往前数）
            String cnUnit = CN_UPPER_MONETARY_UNIT[position];// 位置对应的中文单位
            sb.insert(0, cnNumber + cnUnit + " ");
        }

        return sb.toString();
    }

    /**
     * 功能：计算出差补助天数
     * @param goTimeStr 火车出发时间（24h）
     * @param returnTimeStr 火车返回时间（24h）
     * @return 补助天数
     */
    public static double getTravelDays(String goTimeStr, String returnTimeStr) {
        // 定义日期时间格式
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");

        // 解析输入字符串为LocalDateTime对象
        LocalDateTime goTime = LocalDateTime.parse(goTimeStr, formatter);
        LocalDateTime returnTime = LocalDateTime.parse(returnTimeStr, formatter);

        if(goTime.isAfter(returnTime)){
            System.out.println("开始时间在结束时间之后，不合逻辑！");
            return -1;
        }

        // 处理火车出发时间如果在12点之后，则当天只算0.5天
        double startDayFraction = goTime.toLocalTime().isAfter(LocalTime.NOON) ? 0.5 : 1;

        // 处理火车返回时间如果在12点之前，则当天只算0.5天
        double endDayFraction = returnTime.toLocalTime().isBefore(LocalTime.NOON) ? 0.5 : 1;

        // 计算中间的天数
        long daysBetween = ChronoUnit.DAYS.between(goTime.toLocalDate().atStartOfDay(), returnTime.toLocalDate().atStartOfDay()) - 1;

        // 计算总天数，包括部分天
        double totalDays = daysBetween + startDayFraction + endDayFraction;

        return totalDays;
    }

    /**
     * 功能：计算出差补助总金额
     * @param daysNum 补助天数
     * @return 出差补助总金额
     */
    public static double getTravelSubsidy(double daysNum){
        double totalExpenses = 0;
        int subsidy5 = 5 * 60;
        int subsidy10 = 5 * 60 + 5 * 80;

        if(daysNum > 0 && daysNum <= 5){
            totalExpenses = daysNum * 60;
        }else if(daysNum > 5 && daysNum <= 10){
            totalExpenses = subsidy5 + (daysNum - 5) * 80;
        }else if(daysNum > 10){
            totalExpenses = subsidy10 + (daysNum - 10) * 100;
        }

        return totalExpenses;
    }
}
